﻿#pragma once
#include<stdlib.h>
#include<stdio.h >
#include<windows.h>
#include<stdbool.h>
#include<time.h>

#define POS_X 24
#define POS_Y 5
#define WALL L'※'
#define BODY L'●'
#define FOOD L'★'
#define KEY_PRESS(vk)  ((GetAsyncKeyState(vk)&1)?1:0)
//类型声明
//枚举
//蛇的方向
enum DIRECTION
{
	UP = 1,
    DOWN,
	LEFT,
	RIGHT
};
//游戏状态
enum GAME_STATUS
{
	OK,//正常
	KILL_BY_WALL,//撞墙
    KILL_BY_SELF,//撞到自己
	END_NORMAL//正常退出
};
//定义蛇身的节点类型
typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode,*pSnakeNode;
//贪吃蛇
typedef struct Snake
{
	SnakeNode* psnake;//指向蛇头的指针
	SnakeNode* pfood;//指向食物的指针
	enum DIREATION dir;//蛇的方向
	enum GAME_STATUS status;//游戏状态
	int food_weight;//一个食物的分数
	int score;//总成绩
	int sleep_time;//休息时间，即速度快慢
}Snake;

//函数声明
//定位光标位置
void SetPos(short x, short y);
//游戏的初始化
void GameStart(Snake* ps);
//欢迎界面的打印
void WelcomeToGame();
//绘制地图
void GreatMap();
//初始化蛇身
void InitSnake(Snake* ps);
//创建食物
void CreateFood(Snake* ps);
//游戏运行
void GameRun(Snake* ps);
//蛇的移动-走一步
void SnakeMove(Snake* ps);
//判断下一个坐标是否是食物
int NextIsFood(SnakeNode* pn, Snake* ps);
//下一个位置是食物，就吃掉食物
void EatFood(SnakeNode* pn, Snake* ps);
//下一个位置不是食物
void NoFood(SnakeNode* pn, Snake* ps);
//检测蛇是否撞墙
void KillByWall(Snake* ps);
//检测蛇是否撞到自己
void KillBySelf(Snake* ps);
//游戏善后的工作
void GameEnd(Snake* ps);